Ana içeriğe geç

Fonksiyonlar

Fonksiyonlar programlama dilleri için büyük önem arz etmektedir. Bu durum Rust için de farklı olmamaktadır. Hatta şu ana kadar fark etmiş olabileceğiniz gibi tüm kodlarımızı bir fonksiyon olan main() içerisinde yazdık.

Bu main() fonksiyonu Rust dosyası çalıştırılır çalıştırılmaz harekete geçecek dosya olmaktadır. Programlar için giriş noktası olmaktadır.

Yine main fonksiyonundan da görüntüleyebileceğiniz üzere fonksiyonları tanımlarken Rust üzerinde fn anahtar kelimesini kullanmaktayız.

fn fonksiyon_ismi(){
// fonksiyon içeriği
}

Rust aynı zamanda fonksiyon isimlendirmeleri için Snake Case adı verilen bir isimlendirme yapısını kullanmaktadır. Bu kısımda yazılım dilleri arasında iki adet ana yapının kullanıldığını fark edebiliriz. Bunlar Camel Case ve Snake Case olmaktadır. Alt kısımda normal bir text'in iki türde de ifade edilidiği görüntülenebilir.

  • Efendiler yarın Cumhuriyeti ilan edeceğiz. (Normal Yazım)
  • efendilerYarınCumhuriyetiİlanEdeceğiz. (Camel Case)
  • efendiler_yarın_cumhuriyeti_ilan_edeceğiz. (Snake Case)

Fonksiyon tanımlarken ilk olarak fn anahtar kelimesi ile başlanır. Bu anahtar kelime Rust'a bir fonksiyon tanımlayacağımızın sinyalini verir. Sonrasında Snake Case ile fonksiyonumuzun ismini tanımlarız. Bu isme tam birleşik olarka bir parantez yapısı () eklememiz gerekmektedir. Bu yapı içerisine fonksiyonda kullanacağımız ve fonksiyon çağırılırken girdi olarak girilecek parametrelerin fonksiyon içerisinde nasıl isimlendirileceğini belirtmektedir. Son olarak da bir süslü parantez açıp kapatarak fonksiyon içerisinde çalışmasını istediğimiz kodları bu parantez yapısı içerisine yerleştiririz.

Hadi bir fonksiyon oluşturarak başlayalım. BU fonksiyonumuz her çağırdığımızda terminale bir mesaj göndersin.

fn merhaba_de(){
println!("Fonksiyonumuzun içerisinden herkese kucak dolusu selamlar");
}

Fonksiyonumuzu tanımladık ancak nasıl çağırmamız gerekiyor? Bu işlemi yaparken de çağırmak istediğimiz kısma fonksiyonumuzun ismini parantezler ile yazmamız yeterlidir. Biz bu kodu dosyamız çalışır çalışmaz yazdırmak istediğimiz için main() fonksiyonu içerisine yazdırabiliriz.

fn main(){
merhaba_de(); //Fonksiyonumuzun içerisinden herkese kucak dolusu selamlar
}

Daha önceden de bahsettiğimiz gibi fonksiyonlar içerisine istediğimiz verileri parametre veya diğer adı olan argüman olarak gönderebiliriz. Bu işlemi yapmak için ilk olarak fonksiyon tanımlanırken kullandığımız parantezler içerisine içerisine eklenecek verinin fonksiyon içerisindeki ismi ve tipi yer alacaktır.

fn merhaba_de(senin_ismin: &str){
println!("Merhaba {}; nassın, iyisin? Anangiller, babangiller, çoluğun çocuğungiller iyiler inşallah?", senin_ismin);
}

Fonksiyon parametresini yerleştirdiksen sonra fonskiyonumuzu çağırırken fonksiyon parantezinin içerisine girmek istediğimiz değeri yazarsak bu değer fonksiyonun içerisinde senin_ismin değişkenine kaydedilir ve fonksiyon içerisinde kullanılan bir hâl alır.

merhaba_de("Aybars"); // Merhaba Aybars; nassın, iyisin? Anangiller, babangiller, çoluğun çocuğungiller iyiler inşallah?

Aynı zamanda fonksiyonların girdileri olabildiği gibi çıktıları da olabilmektedir. Bu çıktıları tanımlarken fonksiyonun kod bloğu kısmı olan süslü parantez yapısına girmeden önce -> yapısını kullanarak fonksiyonumuzun çıktı vereceği değerin türünü yazmamız gerekmektedir.

Bu örneği ifade etmek için örnek bir fonksiyon tanımlayalım. Mesela bir fonksiyonumuz olsun ve bu fonksiyon içerisine girdiğimiz değeri 10 arttırıp bu toplamın 3 ile bölümünden kalanını bulsun ve bize geri döndürsün.

fn topla_kalan_bul(mut deger: u64) -> u64{
deger = deger + 10;
let bolum_kalan:u64 = deger % 3;
bolum_kalan
}

Üsteki kodumuzu incelediğimizde ilk olarak bir topla_kalan_bul fonksiyonu tanımladığımızı görüntüleyebiliriz. Bu fonksiyona parametre olarak deger argümanının göndermekteyiz. Burada da fark edebileceğimiz üzere bu değer fonksiyon içerisinde değişime uğrayacağı için mut olarak tanımlanmıştır. Sonrasında sonuç olarak bir u64 tipinde değer alacağımız için -> u64 yapısı kod bloğundan hemen önce eklenmiştir. Kod içerisinde işlemler yapıldıktan sonra fonksiyonun çıktısının çıktı olacağını belirtmek için birçok yöntem olsa da şu anlık bolum_kalan ifadesinin ; kullanılmadan yazılması tercih edilmiştir.

Bu fonksiyon artık çağırıldığında bir fonksiyonun içerisine girildiğinde veya bir değişkene eşitlendiğinde çıktı olarak verdiği değer eşit olacaktır.

fn main() {
let kalan:u64 = topla_kalan_bul(6);
println!("{}",kalan); /1
}

Aynı zamanda bir fonksiyon duruma göre birden fazla değişkeni de çıktı edebilmektedir. Ancak bu koşullu şartları incelediğimizde sonradan bahsedilecektir.